using System;
using System.Web.UI;
using Microsoft.Practices.ServiceLocation;
using SIP.PN.Servicios.Interfaces;

namespace SIP.PN.FrontEnd.Code
{
    public abstract class PaginaAbstracta : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request["ajaxfuncion"] != null)
            {
                AjaxFuncions(Request["ajaxfuncion"]);
            }
            else
            {
                if (!IsPostBack)
                {
                    Inicializar();
                    Seguridad();
                }
            }
        }

        public abstract void Inicializar();
        public abstract void Seguridad();
        public virtual void AjaxFuncions(string funcion)
        {
            
        }

        #region Propiedades

        private Utilidades utilidades;
        public Utilidades Utilidades
        {
            get
            {
                if (utilidades==null)
                    utilidades = new Utilidades();
                return utilidades;
            }
        }

        #endregion

        #region Servicios

        private IServicioAplicacion srvAplicacion;
        public IServicioAplicacion SrvAplicacion
        {
            get
            {
                if (srvAplicacion == null)
                    srvAplicacion = ServiceLocator.Current.GetInstance<IServicioAplicacion>();
                return srvAplicacion;
            }
        }

        private static IServicioOperario srvOperario;
        public static IServicioOperario SrvOperario
        {
            get
            {
                if (srvOperario == null)
                    srvOperario = ServiceLocator.Current.GetInstance<IServicioOperario>();
                return srvOperario;
            }
        }

        private static IServicioProyecto srvProyecto;
        public static IServicioProyecto SrvProyecto
        {
            get
            {
                if (srvProyecto == null)
                    srvProyecto = ServiceLocator.Current.GetInstance<IServicioProyecto>();
                return srvProyecto;
            }
        }

        private static IServicioTarea srvTarea;
        public static IServicioTarea SrvTarea
        {
            get
            {
                if (srvTarea == null)
                    srvTarea = ServiceLocator.Current.GetInstance<IServicioTarea>();
                return srvTarea;
            }
        }

        private static IServicioTipoDeProyecto srvTipoDeProyecto;
        public static IServicioTipoDeProyecto SrvTipoDeProyecto
        {
            get
            {
                if (srvTipoDeProyecto == null)
                    srvTipoDeProyecto = ServiceLocator.Current.GetInstance<IServicioTipoDeProyecto>();
                return srvTipoDeProyecto;
            }
        }

        #endregion

        #region Methods for parameters

        private SessionParameters parameter
        {
            get
            {
                if (Session[Constantes.PageParameter] == null)
                    Session.Add(Constantes.PageParameter, new SessionParameters());
                return (SessionParameters)Session[Constantes.PageParameter];
            }
        }

        public void AgregarParametro(string key, object value)
        {
            parameter.AddParameter(key, value);
        }

        public T ObtenerParametro<T>(string key)
        {
            return parameter.GetParameter<T>(key);
        }

        public void EliminarParametro(string key)
        {
            parameter.RemoveParameter(key);
        }

        public bool ExisteParametro(string key)
        {
            return parameter.ContainsParameter(key);
        }

        #endregion

        #region Override Methods

        //protected override void OnPreRender(EventArgs e)
        //{
        //    base.OnPreRender(e);
        //}

        protected override void OnLoadComplete(EventArgs e)
        {
            parameter.RemoveAll();
            base.OnLoadComplete(e);
        }

        #endregion        
    }
}
